var obj = {};

obj.toString = function () {
  console.log('toString');
  return 1;
}

obj.valueOf = function () {
  console.log('valueOf');
  return 2;
}

console.log(Number(obj));
/**
  1. 当使用 Number 转换类型时，会调用其 valueOf()
  2. 如果其返回值为原始值，那么通过 Number() 包装后返回
  3. 如果其方法返回一个引用值则将执行其 toString()
  4. 如果其返回值为原始值，通过 Number() 包装后返回
  5. 如果该方法也返引用值的话，那么将报错，Cannot convert object to primitive value
  6. 最后如果其没有 toString() 的话，那么回去原型链中查找，在 Object.prototype 上有 toString() 与 valueOf()，调用其类型自身原型上的 toString()
  7. 上述结果应该返回 [object object] ，最终带入 Number('[object object]') 返回 NaN

  注：因为 obj 是 Object 类型，所以调用的是 Object.prototype 的 toString()，若 obj 为其它类型则调用其它类型原型上的 toString ，如 Array，Boolean...等
*/
// console.log(String(obj));